home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 138 / 138.xpi / chrome / stumbleupon.jar / content / preferenceDialog.js < prev    next >
Text File  |  2010-01-22  |  42KB  |  1,358 lines

  1.  
  2. function su_include(uri)
  3. {
  4.     try {
  5.         su_get_service(
  6.                     "@mozilla.org/moz/jssubscript-loader;1",
  7.                     "mozIJSSubScriptLoader")
  8.                     .loadSubScript(uri);
  9.     }
  10.     catch (e) {
  11.         if ((uri != "chrome://stumbleupon/content/extra.js") || 
  12.                     su_test_extra_init)
  13.             su_log_error("INCLUDE", e, uri);
  14.     }
  15. }
  16.  
  17. function su_create_instance(nsclass, nsinterface)
  18. {
  19.     try {
  20.         return Components.classes[nsclass]
  21.                     .createInstance(Components.interfaces[nsinterface]);
  22.     } catch (e) {
  23.         return null;
  24.     }
  25. }
  26.  
  27. function su_get_service(nsclass, nsinterface)
  28. {
  29.     try {
  30.         return Components.classes[nsclass]
  31.                     .getService(Components.interfaces[nsinterface]);
  32.     } catch (e) {
  33.         return null;
  34.     }
  35. }
  36.  
  37. function su_get_element(id)
  38. {
  39.     return document.getElementById(id);
  40. }
  41.  
  42. var su_service;
  43. try {
  44.     su_service = Components.classes["@stumbleupon.com/stumbleupon-service;1"].getService().wrappedJSObject;
  45. }
  46. catch (e) {
  47.     // seamonkey kludge
  48.     su_include("chrome://stumbleupon/content/stumbleuponService.js");
  49.     su_service = new su_Service();
  50. }
  51.  
  52. var su_ds = su_service.getDatastore();
  53. var icons_only;
  54. var bad_stumble;
  55. var great_stumble;
  56. var parent_window = null;
  57. var search_plugin;
  58. //var autocomplete_source;
  59. var keyspec;
  60. var shortcut_item;
  61. var recent_keypress_modifiers;
  62. var preferred_position_group;
  63. var preferred_show_firstrater_label_always;
  64. var stumbleupon_toolbar_menuitem = null;
  65. var download_favs_context = null;
  66. var bookmarks_backup_dir = null;
  67. var TOGGLE_TOOLBAR_LISTITEM_INDEX = 4;
  68. var enable_ids = [
  69.             "shortcut_stumble",
  70.             "shortcut_thumbup",
  71.             "shortcut_thumbdown",
  72.             "shortcut_tag",
  73.             "shortcut_reviews"];
  74. //            "shortcut_details"
  75. var mode_ids = [
  76. //            "show_mode_all",
  77.             "show_mode_friends",
  78.             "show_mode_news",
  79.             "show_mode_photo",
  80.             "show_mode_search",
  81.             "show_mode_stumblers",
  82.             "show_mode_video",
  83.             "show_mode_wiki",
  84.             "show_mode_more"];
  85.     
  86. //
  87. // setUserChangedValue
  88. //
  89. // We want to track whether the user changes certain values.  This function
  90. // takes care of this by adding a new boolean key when the value is changed by
  91. // the user.
  92. //
  93. function setUserChangedValue(key, newValue)
  94. {
  95.     var oldValue = su_ds.getValue(key);
  96.     if(oldValue != newValue)
  97.     {
  98.         su_ds.setValue(key + "_user_changed", true);
  99.         su_ds.setValue(key, newValue);
  100.     }
  101. }
  102.  
  103. function doOK()
  104. {
  105.     //!!! Update all open windows for this application. -- JW
  106.  
  107.     // now save new prefs...
  108.  
  109.     if (is_parent_window_destroyed())
  110.     {
  111.         su_get_element("stumble_pref_dialog").cancelDialog();
  112.         return true;
  113.     }
  114.     
  115.     su_ds.setValue("$show_mode", su_get_element("show_mode").checked);
  116.     for (i = 0; i < mode_ids.length; i++)
  117.     {
  118.         su_ds.setValue("$" + mode_ids[i], su_get_element(mode_ids[i]).checked);
  119.     }
  120.     
  121.     su_ds.setValue("$show_field", su_get_element("show_field").checked);
  122.  
  123.     // see if they have changed...
  124.     var thebutton = su_get_element("bad-stumble");
  125.     bad_stumble = thebutton.checked;
  126.     su_ds.setValue("$bad_stumble", bad_stumble);
  127.  
  128.     thebutton = su_get_element("great-stumble");
  129.     great_stumble = thebutton.checked;
  130.     su_ds.setValue("$great_stumble", great_stumble);
  131.  
  132.     su_ds.setValue("$prefetch", su_get_element("prefetch").checked);
  133.  
  134. //    su_ds.setValue("$comment_firstrating", su_get_element("comment_firstrating").checked);
  135.  
  136.     su_ds.setValue("$review_new_window", su_get_element("review_new_window").checked);
  137.     su_ds.setValue("$rate_new_window", su_get_element("rate_new_window").checked);
  138. //    su_ds.setValue("$search_new_window", su_get_element("search_new_window").checked);
  139.  
  140.     var new_show_topics = su_get_element("show_topics").checked;
  141.     su_ds.setValue("$show_topics", new_show_topics);
  142.  
  143.     var new_stumble_topics = su_get_element("stumble_topics").checked;
  144.     su_ds.setValue("$stumble_topics", new_stumble_topics);
  145.  
  146.     var new_show_topics_style = su_get_element("stumble_topics2_style_menu").selectedItem;
  147.     if (new_show_topics_style)
  148.         su_ds.setValue("$stumble_topics_style", new_show_topics_style.value);
  149.     else
  150.         su_ds.setValue("$stumble_topics_style", 0);
  151.  
  152.     var new_show_info = su_get_element("show_info").checked;
  153.     setUserChangedValue("$show_info", new_show_info);
  154.     
  155.     var new_show_tag = su_get_element("show_tag").checked;
  156.     su_ds.setValue("$show_tag", new_show_tag);
  157.     if (new_show_tag)
  158.         su_ds.setValue("$shown_tag", true);
  159.  
  160. //    var new_show_flag = su_get_element("show_flag").checked;
  161. //    su_ds.setValue("$show_flag", new_show_flag);
  162.  
  163. //    var new_show_search = su_get_element("show_search").checked;
  164. //    su_ds.setValue("$show_search", new_show_search);
  165.  
  166. //    su_ds.setValue("$show_legacy_network",  
  167. //                su_get_element("show_legacy_network").checked);
  168.  
  169.     var new_show_home = su_get_element("show_home").checked;
  170.     setUserChangedValue("$show_home", new_show_home);
  171.  
  172. //    var new_show_editinfo = su_get_element("show_editinfo").checked;
  173. //    su_ds.setValue("$show_editinfo", new_show_editinfo);
  174.  
  175. //    su_ds.setValue("$show_legacy_forums", 
  176. //                su_get_element("show_legacy_forums").checked);
  177.  
  178.     var new_show_friends = su_get_element("show_friends").checked;
  179.     setUserChangedValue("$show_friends", new_show_friends);
  180.  
  181.     var new_sync_bm_meta = su_get_element("sync_bm_meta").checked;
  182.     su_ds.setValue("$sync_bm_meta", new_sync_bm_meta);
  183.  
  184.     var new_sync_bm_adult = ! su_get_element("sync_bm_exclude_adult").checked;
  185.     su_ds.setValue("$sync_bm_adult", new_sync_bm_adult);
  186.  
  187.     var new_show_matches = su_get_element("show_matches").checked;
  188.     su_ds.setValue("$show_matches", new_show_matches);
  189.  
  190.     var new_show_aboutme = su_get_element("show_aboutme").checked;
  191.     su_ds.setValue("$show_aboutme", new_show_aboutme);
  192.  
  193.     var new_show_groups = su_get_element("show_groups").checked;
  194.     su_ds.setValue("$show_groups", new_show_groups);
  195.  
  196.     var new_show_messages = su_get_element("show_messages").checked;
  197.     su_ds.setValue("$show_messages", new_show_messages);
  198.  
  199.     var new_show_referral = su_get_element("show_referral").checked;
  200.     setUserChangedValue("$show_referral", new_show_referral);
  201.  
  202.     var new_search_clear_queries = su_get_element("search_clear_queries").checked;
  203.     su_ds.setValue("$search_clear_queries", new_search_clear_queries);
  204.  
  205.     var new_show_searchlinks_score = su_get_element("show_searchlinks_score").checked;
  206.     su_ds.setValue("$show_searchlinks_score", new_show_searchlinks_score);
  207.  
  208.     var new_show_searchlinks_friends = su_get_element("show_searchlinks_friends").checked;
  209.     su_ds.setValue("$show_searchlinks_friends", new_show_searchlinks_friends);
  210.  
  211.     var new_show_searchlinks_topic = su_get_element("show_searchlinks_topic").checked;
  212.     su_ds.setValue("$show_searchlinks_topic", new_show_searchlinks_topic);
  213.  
  214.     var new_show_searchlinks_logo = su_get_element("show_searchlinks_logo").checked;
  215.     su_ds.setValue("$show_searchlinks_logo", new_show_searchlinks_logo);
  216.  
  217.     var new_stumble_upon_change = su_get_element("stumble_upon_change").checked;
  218.     su_ds.setValue("$stumble_upon_change", new_stumble_upon_change);
  219.  
  220. //    var new_autocomplete_type = su_get_element("search_group").selectedItem.value;
  221. //    su_ds.setValue("$autocomplete_type", new_autocomplete_type);
  222.  
  223.     // now see if icons thingies have changed...
  224.     var new_icons_only;
  225.     if (su_get_element("icons-only").selected)
  226.     {
  227.         new_icons_only = "icons-only";
  228.         su_ds.setValue("$show_firstrater_label_always", su_get_element("show_firstrater_label_always").checked);
  229.     }
  230.     else if (su_get_element("text-icons").selected)
  231.     {
  232.         new_icons_only = "text-icons";
  233.         su_ds.setValue("$show_firstrater_label_always", preferred_show_firstrater_label_always);
  234.     }
  235.     su_ds.setValue("$icons", new_icons_only);
  236.  
  237. //    else if (su_get_element("extra-text").selected)
  238. //        new_icons_only = "extra-text";
  239.  
  240. /*
  241.     if ((navigator.userAgent.indexOf("Win") != -1) &&
  242.                 (navigator.userAgent.indexOf("Firefox") != -1))
  243.     {
  244.         // The plugin only works on Firefox under XP for now....
  245.         // See also the relevant section in stumbleuponOverlay.js.
  246.  
  247.         var new_search_plugin = su_get_element("search_plugin").checked;
  248.  
  249.         if (new_search_plugin != search_plugin)
  250.         {
  251.             su_ds.setValue("$search_plugin", new_search_plugin);
  252.             if (parent_window)
  253.             {
  254.                 if (new_search_plugin)
  255.                 {
  256.                     parent_window.su_add_search_plugin(1);
  257.                     alert("The search engine plugin will be added when you restart your browser.");
  258.                 }
  259.                 else
  260.                 {
  261.                     parent_window.su_remove_search_plugin();
  262.                     alert("The search engine plugin will be removed when you restart your browser.");
  263.                 }
  264.             }
  265.         }
  266.     }
  267. */
  268.     var toolbar_toggle_visible = su_get_element("toggle").checked;
  269.     su_ds.setValue("@toolbar_toggle_visible", toolbar_toggle_visible)
  270.     var old_toolbar_position = su_ds.getValue("@toolbar-position");
  271.     var toolbar_position = su_get_element("toolbar-position").selectedItem.id;
  272.     su_ds.setValue("@toolbar-position", toolbar_position);
  273.     if (su_get_element("position-group").selectedItem)
  274.     {
  275.         var toolbar = parent_window.su_get_element(toolbar_position);
  276.         var customizable = (toolbar.hasAttribute("customizable") && 
  277.                     (toolbar.getAttribute("customizable") == "true"))
  278.  
  279.         var position_group = su_get_element("position-group").selectedItem.id;
  280.         
  281.         if ((position_group == "drop") && ((! customizable) ||
  282.                     (toolbar_position != old_toolbar_position)))
  283.             position_group = "first";
  284.             
  285.         su_ds.setValue("@position-group", position_group);
  286.     }
  287.  
  288.     var shortcuts_enabled = su_get_element("shortcuts-enable").checked;
  289.     su_ds.setValue("$shortcuts_enabled", shortcuts_enabled);
  290.     
  291.     var shortcut_stumble = su_get_element("shortcut_stumble").getAttribute("keyspec");
  292.     su_ds.setValue("$shortcut_stumble", shortcut_stumble);
  293.  
  294.     var shortcut_reviews = su_get_element("shortcut_reviews").getAttribute("keyspec");
  295.     su_ds.setValue("$shortcut_reviews", shortcut_reviews);
  296.  
  297.     var shortcut_thumbup = su_get_element("shortcut_thumbup").getAttribute("keyspec");
  298.     su_ds.setValue("$shortcut_thumbup", shortcut_thumbup);
  299.  
  300.     var shortcut_thumbdown = su_get_element("shortcut_thumbdown").getAttribute("keyspec");
  301.     su_ds.setValue("$shortcut_thumbdown", shortcut_thumbdown);
  302.  
  303.     var shortcut_tag = su_get_element("shortcut_tag").getAttribute("keyspec");
  304.     su_ds.setValue("$shortcut_tag", shortcut_tag);
  305.  
  306. //    var shortcut_details = su_get_element("shortcut_details").getAttribute("keyspec");
  307. //    su_ds.setValue("$shortcut_details", shortcut_details);
  308.  
  309.     var shortcut_toolbar = su_get_element("shortcut_toolbar").getAttribute("keyspec");
  310.     su_ds.setValue("$shortcut_toolbar", shortcut_toolbar);
  311.     
  312.     su_ds.flushPrefs();
  313.  
  314.     parent_window.setTimeout(function (parent) { parent.su_handle_preference_dialog_accept(); }, 0, parent_window);
  315.     
  316.     return true;
  317. }
  318.  
  319. function doCancel(event)
  320. {
  321.     if (! is_parent_window_destroyed())
  322.     {
  323.         parent_window.su_preference_dialog = null;
  324.     }
  325.     
  326.     return true;
  327. }
  328.  
  329. function is_parent_window_destroyed()
  330. {
  331.     // Verify that the window is undestroyed. -- JW
  332.     try { var str = parent_window.location + " "; }
  333.     catch (e)
  334.     {
  335.         return true;
  336.     }
  337.     return false;
  338. }
  339.  
  340. function init()
  341. {
  342.     var i;
  343.     if (opener && opener.location.href.indexOf("extensions.xul") != -1)
  344.     {
  345.         if (opener.opener && (opener.opener.location.href.indexOf("browser.xul") != -1))
  346.         {
  347.             // opened from the extensions window
  348.             parent_window = opener.opener;
  349.         }
  350.         else 
  351.         {
  352.             // possibly opened from the all-in-one sidebar
  353.             var window_service = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  354.                         .getService(Components.interfaces.nsIWindowMediator);
  355.             parent_window = window_service.getMostRecentWindow("navigator:browser");
  356.         }
  357.     }
  358.     else
  359.     {
  360.         // opened via the toolbar Menu
  361.         parent_window = opener;
  362.     }
  363.     
  364.     if (is_parent_window_destroyed())
  365.     {
  366.         su_get_element("stumble_pref_dialog").cancelDialog();
  367.         return;
  368.     }
  369.     
  370.     
  371.     parent_window.su_preference_dialog = su_get_element("stumble_pref_dialog");
  372.     
  373.     var deck = su_get_element("prefs_deck");
  374.     
  375.     var accept_button = document.getElementById("stumble_pref_dialog").getButton("accept");
  376.     
  377.     if (su_ds.getValue("@current_user") == 0)
  378.     {
  379.         var id_list = su_ds.getValue("@id_list");
  380.         
  381.         var ids = id_list.split(":");
  382.         
  383.         var found_an_id = false;
  384.         
  385.         for (i = 0; i < ids.length; i++)
  386.         {
  387.             if (ids[i] == "")
  388.                 continue;
  389.             
  390.             found_an_id = true;
  391.             break;
  392.         }
  393.         
  394.         deck.selectedPanel = su_get_element("prefs_signin");
  395.         accept_button.collapsed = true;
  396. //        if (found_an_id)
  397. //        {
  398. //            alert("You can edit preferences after you sign-in.\n\n" +
  399. //                        'Click the "Start Stumbling..." button on the toolbar to sign-in.');
  400. //        }
  401. //        else
  402. //        {
  403. //            alert("You can edit toolbar preferences after you create a StumbleUpon profile.\n\n" +
  404. //                        'Click the "Start Stumbling..." button on the toolbar to create a profile.');
  405. //        }
  406. //        window.close();
  407.         return;
  408.     }
  409.     else
  410.     {
  411.         deck.selectedPanel = su_get_element("prefs_tabbox");
  412.         accept_button.collapsed = false;
  413.     }
  414.     
  415.     var detail;
  416.     if (window.arguments && window.arguments.length)
  417.         detail = window.arguments[0];
  418.     else
  419.         detail = null;
  420.     
  421.     su_get_element("sync_bm_meta").checked = su_ds.getValue("$sync_bm_meta");
  422.     su_get_element("sync_bm_exclude_adult").checked = (! su_ds.getValue("$sync_bm_adult"));
  423.     update_download_favs_enabled_state();
  424.     
  425.     if (su_ds.hasFeature("$sociallinks"))
  426.         su_get_element("show_searchlinks_friends_box").hidden = false;
  427.     
  428. //    if (su_ds.hasFeature("$reportoption"))
  429. //        su_get_element("show_flag_box").hidden = false;
  430.     
  431.     if (parent_window.su_host.places && (! su_ds.getValue("#migrating_places")))
  432.         su_get_element("favs_box").hidden = false;
  433.     
  434.     var show_searchlinks_score = su_ds.getValue("$show_searchlinks_score");
  435.     su_get_element("show_searchlinks_score").checked = show_searchlinks_score;
  436.     
  437.     var show_searchlinks_friends = su_ds.getValue("$show_searchlinks_friends");
  438.     su_get_element("show_searchlinks_friends").checked = show_searchlinks_friends;
  439.     
  440.     var show_searchlinks_topic = su_ds.getValue("$show_searchlinks_topic");
  441.     su_get_element("show_searchlinks_topic").checked = show_searchlinks_topic;
  442.     
  443.     var show_searchlinks_logo = su_ds.getValue("$show_searchlinks_logo");
  444.     su_get_element("show_searchlinks_logo").checked = show_searchlinks_logo;
  445.     
  446.     var stumble_upon_change = su_ds.getValue("$stumble_upon_change");
  447.     su_get_element("stumble_upon_change").checked = stumble_upon_change;
  448.     
  449.     su_update_searchlinks_logo_enabled_state();
  450. //    }
  451.     
  452.     bad_stumble = su_ds.getValue("$bad_stumble");
  453.     great_stumble = su_ds.getValue("$great_stumble");
  454.     
  455.     su_get_element("show_field").checked = su_ds.getValue("$show_field");
  456. //    update_field_enabled_state();    
  457. /*
  458.     if ((navigator.userAgent.indexOf("Win") != -1) &&
  459.                 (navigator.userAgent.indexOf("Firefox") != -1))
  460.     {
  461.         search_plugin = su_ds.getValue("$search_plugin");
  462.     }
  463.     else
  464.     {
  465.         // The plugin only works on Firefox under XP for now....
  466.         // Hide the search plug-in configuration control until we figure out
  467.         // how to install/uninstall on other platforms.
  468.         // See also the relevant section in stumbleuponOverlay.js.
  469.         
  470.         su_get_element("search_plugin").hidden = true;
  471.     }
  472. */
  473.  
  474.     su_get_element("show_mode").checked = su_ds.getValue("$show_mode");
  475.     for (i = 0; i < mode_ids.length; i++)
  476.     {
  477.         su_get_element(mode_ids[i]).checked = su_ds.getValue("$" + mode_ids[i]);
  478.     }
  479.     update_mode_enabled_state();
  480.     
  481.     // set inputs...
  482.     su_get_element("bad-stumble").checked = bad_stumble;
  483.     su_get_element("great-stumble").checked = great_stumble;
  484. //    su_get_element("search_plugin").checked = search_plugin;
  485.     
  486.     su_get_element("prefetch").checked = su_ds.getValue("$prefetch");
  487. //    su_get_element("comment_firstrating").checked = su_ds.getValue("$comment_firstrating");
  488.     su_get_element("review_new_window").checked = su_ds.getValue("$review_new_window");
  489.     su_get_element("rate_new_window").checked = su_ds.getValue("$rate_new_window");
  490. //    su_get_element("search_new_window").checked = su_ds.getValue("$search_new_window");
  491.     su_get_element("stumble_topics").checked = su_ds.getValue("$stumble_topics");
  492.     su_get_element("stumble_topics2").checked = su_ds.getValue("$stumble_topics");
  493.     su_get_element("stumble_topics2_style_menu").disabled = !su_ds.getValue("$stumble_topics");
  494.     var current_select = su_ds.getValue("$stumble_topics_style");
  495.     if (current_select == 1 || current_select == 2)
  496.         su_get_element("stumble_topics2_style_menu").selectedIndex = current_select;
  497.     else
  498.         su_get_element("stumble_topics2_style_menu").selectedIndex = 0;
  499.     su_get_element("search_clear_queries").checked = su_ds.getValue("$search_clear_queries");
  500.     
  501.     su_get_element("show_topics").checked = su_ds.getValue("$show_topics");
  502.     su_get_element("show_info").checked = su_ds.getValue("$show_info");
  503. //    su_get_element("show_search").checked = su_ds.getValue("$show_search");
  504.     su_get_element("show_tag").checked = su_ds.getValue("$show_tag");
  505.     su_get_element("show_tag2").checked = su_ds.getValue("$show_tag");
  506. //    su_get_element("show_flag").checked = su_ds.getValue("$show_flag");
  507.     su_get_element("show_referral").checked = su_ds.getValue("$show_referral");
  508.     su_get_element("show_aboutme").checked = su_ds.getValue("$show_aboutme");
  509.     su_get_element("show_home").checked = su_ds.getValue("$show_home");
  510.     su_get_element("show_friends").checked = su_ds.getValue("$show_friends");
  511.     su_get_element("show_messages").checked = su_ds.getValue("$show_messages");
  512. //    su_get_element("show_legacy_network").checked = su_ds.getValue("$show_legacy_network");
  513.     su_get_element("show_matches").checked = su_ds.getValue("$show_matches");
  514. //    su_get_element("show_legacy_forums").checked = su_ds.getValue("$show_legacy_forums");
  515.     su_get_element("show_groups").checked = su_ds.getValue("$show_groups");
  516. //    su_get_element("show_editinfo").checked = su_ds.getValue("$show_editinfo");
  517.     
  518.     su_get_element("toggle").checked = su_ds.getValue("@toolbar_toggle_visible");
  519.     
  520.     icons_only = su_ds.getValue("$icons");
  521.     
  522.     if (icons_only == "extra-text")
  523.         icons_only = "text-icons";
  524.     
  525.     su_get_element("text-group").selectedItem = su_get_element(icons_only);
  526.     
  527.     preferred_show_firstrater_label_always = su_ds.getValue("$show_firstrater_label_always");
  528.     update_firstrater_label_enabled_state();
  529.     
  530. //    var autocomplete_type = su_ds.getValue("$autocomplete_type");
  531. //    su_get_element("search_group").selectedItem = su_get_element("search_group_" + autocomplete_type);
  532.     
  533.     var shortcut_stumble_default;
  534.     var shortcut_reviews_default;
  535.     var shortcut_thumbup_default;
  536.     var shortcut_thumbdown_default;
  537.     var shortcut_tag_default;
  538. //    var shortcut_details_default;
  539.     var shortcut_toolbar_default;
  540.     
  541.     if (parent_window.su_host.mac)
  542.     {
  543.         shortcut_stumble_default = "Alt+VK_ESCAPE";
  544.         shortcut_thumbup_default = "Alt+VK_F1";
  545.         shortcut_thumbdown_default = "Alt+VK_F2";
  546.         shortcut_tag_default     = "Alt+VK_SLASH";
  547.         shortcut_reviews_default = "Alt+VK_F3";
  548. //        shortcut_details_default = "Alt+VK_F4";
  549.         shortcut_toolbar_default = "Command+VK_F11";
  550.     }
  551.     else if (parent_window.su_host.win)
  552.     {
  553.          shortcut_stumble_default = "Alt+VK_BACK_QUOTE";
  554.          shortcut_thumbup_default = "Alt+VK_1";
  555.          shortcut_thumbdown_default = "Alt+VK_2";
  556.         shortcut_tag_default     = "Alt+VK_SLASH";
  557.          shortcut_reviews_default = "Alt+VK_3";
  558. //        shortcut_details_default = "Alt+VK_4";
  559.         shortcut_toolbar_default = "Ctrl+VK_F11";
  560.     }
  561.     else
  562.     {
  563.         shortcut_stumble_default = "Alt+VK_ESCAPE";
  564.         shortcut_thumbup_default = "Alt+VK_F1";
  565.         shortcut_thumbdown_default = "Alt+VK_F2";
  566.         shortcut_tag_default     = "Alt+VK_SLASH";
  567.          shortcut_reviews_default = "Alt+VK_F3";
  568. //        shortcut_details_default = "Alt+VK_F4";
  569.         shortcut_toolbar_default = "Ctrl+VK_F11";
  570.     }
  571.     var shortcut_stumble = su_ds.getPrefValue("$shortcut_stumble", shortcut_stumble_default);
  572.     var shortcut_thumbup = su_ds.getPrefValue("$shortcut_thumbup", shortcut_thumbup_default);
  573.     var shortcut_thumbdown = su_ds.getPrefValue("$shortcut_thumbdown", shortcut_thumbdown_default);
  574.     var shortcut_tag = su_ds.getPrefValue("$shortcut_tag", shortcut_tag_default);
  575.     var shortcut_reviews = su_ds.getPrefValue("$shortcut_reviews", shortcut_reviews_default);
  576. //    var shortcut_details = su_ds.getPrefValue("$shortcut_details", shortcut_details_default);
  577.     var shortcut_toolbar = su_ds.getPrefValue("$shortcut_toolbar", shortcut_toolbar_default);
  578.     
  579.     su_get_element("shortcut_stumble").setAttribute("keyspec", shortcut_stumble);
  580.     su_get_element("shortcut_stumble").setAttribute("keyspec-default", shortcut_stumble_default);
  581.     su_get_element("shortcut_thumbup").setAttribute("keyspec", shortcut_thumbup);
  582.     su_get_element("shortcut_thumbup").setAttribute("keyspec-default", shortcut_thumbup_default);
  583.     su_get_element("shortcut_thumbdown").setAttribute("keyspec", shortcut_thumbdown);
  584.     su_get_element("shortcut_thumbdown").setAttribute("keyspec-default", shortcut_thumbdown_default);
  585.     su_get_element("shortcut_tag").setAttribute("keyspec", shortcut_tag);
  586.     su_get_element("shortcut_tag").setAttribute("keyspec-default", shortcut_tag_default);
  587.     su_get_element("shortcut_reviews").setAttribute("keyspec", shortcut_reviews);
  588.     su_get_element("shortcut_reviews").setAttribute("keyspec-default", shortcut_reviews_default);
  589. //    su_get_element("shortcut_details").setAttribute("keyspec", shortcut_details);
  590. //    su_get_element("shortcut_details").setAttribute("keyspec-default", shortcut_details_default);
  591.     
  592.     var shortcuts_enabled = su_ds.getValue("$shortcuts_enabled");
  593.     su_get_element("shortcuts-enable").checked = shortcuts_enabled;
  594.     handle_shortcuts_enable_command(shortcuts_enabled);
  595.     
  596.     su_get_element("shortcut_toolbar").setAttribute("label", "  " + parent_window.su_get_display_keyspec(shortcut_toolbar));
  597.     su_get_element("shortcut_toolbar").setAttribute("keyspec", shortcut_toolbar);
  598.     su_get_element("shortcut_toolbar").setAttribute("keyspec-default", shortcut_toolbar_default);
  599.     
  600.     
  601.     if (! parent_window.BrowserCustomizeToolbar)
  602.     {
  603.         su_get_element("placement-toolkit-caption").hidden = true;
  604.         su_get_element("placement-caption").hidden = false;
  605.         su_get_element("customize-position-box").hidden = true;
  606.     }
  607.     init_toolbar_placement();
  608.     
  609.     if (detail && detail.initial_tab)
  610.         setTimeout(select_tab, 0, detail.initial_tab);
  611. }
  612.  
  613. function select_tab(tabid)
  614. {
  615.     su_get_element("prefs_tabbox").selectedTab = su_get_element(tabid);
  616. }
  617.  
  618. function init_toolbar_placement()
  619. {
  620.     // Create list of toolbars for toolbar-position
  621.     
  622.     var toolbars = parent_window.document.getElementsByTagName("toolbar");
  623.     var statusbars = parent_window.document.getElementsByTagName("statusbar");
  624.     var menubars = parent_window.document.getElementsByTagName("menubar");
  625.     var popup = su_get_element("placement-popup");
  626.     var x, bar, item, val, list;
  627.     
  628.     // first remove the toolbars already there...
  629.     while (popup.hasChildNodes())
  630.         popup.removeChild(popup.firstChild);
  631.     
  632.     toolbars = concat(toolbars, statusbars);
  633.     toolbars = concat(toolbars, menubars);
  634.     
  635.     for (x = 0; x < toolbars.length; x++)
  636.     {
  637.         if (! toolbars[x].hasAttribute("id"))
  638.             continue;
  639.         
  640.         var bar_id = toolbars[x].getAttribute("id");
  641.  
  642.         if (su_ds.lookup("toolbarid:bad_target_flag", bar_id))
  643.             continue;
  644.         
  645.         // Skip non-customizable toolbars with the exception of the status-bar
  646.         if (! toolbars[x].hasAttribute("customizable") ||
  647.             ! (toolbars[x].getAttribute("customizable").toLowerCase() == "true"))
  648.         {
  649.             if(bar_id != "status-bar")
  650.                 continue;
  651.         }
  652.         
  653.         // weird firefox toolbar
  654.         if ((bar_id == "toolbar-menubar") &&
  655.                     (navigator.userAgent.indexOf("Mac") != -1))
  656.             continue;
  657.  
  658.         // Exclude the All-in-One Sidebar extension toolbars. -- JW
  659.         if (bar_id.indexOf("aios") == 0)
  660.             continue;
  661.         
  662.         // Exclude the ScrapBook toolbars. -- JW
  663.         if (bar_id.indexOf("ScrapBook") == 0)
  664.             continue;
  665.         
  666.         // Exclude webdeveloper supplemental toolbars. -- JW
  667.         if ((bar_id.indexOf("webdeveloper") != -1) && 
  668.                     (bar_id != "webdeveloper-toolbar"))
  669.             continue;
  670.         
  671.         item = document.createElement("menuitem");
  672.         item.setAttribute("id", bar_id);
  673.         item.value = bar_id;
  674.         if (item.value == "status-bar")
  675.             item.setAttribute("label", "Status Bar");
  676.         else if (item.value == "toolbar-menubar")
  677.             item.setAttribute("label", "Menu Bar");
  678.         else if (item.value == "nav-bar")
  679.             item.setAttribute("label", "Navigation Toolbar");
  680.         else if (item.value == "PersonalToolbar")
  681.             item.setAttribute("label", "Personal Toolbar");
  682.         else if (item.value == "linktoolbar")
  683.             item.setAttribute("label", "Link Toolbar");
  684.         else if (toolbars[x].hasAttribute("toolbarname"))
  685.             item.setAttribute("label", toolbars[x].getAttribute("toolbarname"));
  686.         else
  687.             item.setAttribute("label", bar_id);
  688.         
  689.         if (bar_id == "stumbleupon")
  690.         {
  691.             stumbleupon_toolbar_menuitem = item;
  692.         }
  693.         
  694.         popup.appendChild(item);
  695.     }
  696.  
  697.     var toolbar_position = su_ds.getValue("@toolbar-position");
  698.     if ((toolbar_position == "webpedia") || 
  699.             (toolbar_position == "fbToolbar"))
  700.     {
  701.         toolbar_position = "stumbleupon";
  702.     }
  703.     su_get_element("toolbar-position").selectedItem = su_get_element(toolbar_position);
  704.  
  705.     var position_group = su_ds.getValue("@position-group");
  706.     if ((toolbar_position == "stumbleupon") || 
  707.             (toolbar_position == "gtbToolbar") || 
  708.             (toolbar_position == "yahoo-toolbar") ||
  709.             (toolbar_position == "prefbar") ||
  710.             (toolbar_position == "MBSTB-Toolbar"))
  711.     {
  712.         position_group = "first";
  713.         su_ds.setValue("@position-group", "first");
  714.     }
  715.     preferred_position_group = position_group;
  716.     su_get_element("position-group").selectedItem = su_get_element(position_group);
  717.     
  718.     handle_toolbar_position_command(toolbar_position);
  719.     handle_position_group_command(position_group);
  720. }
  721.     
  722. function concat(c1, c2)
  723. {
  724.     // Concats too collections into an array.
  725.     var c3 = new Array(c1.length + c2.length);
  726.     var x,y = 0;
  727.     
  728.     for (x = 0; x < c1.length; x++)
  729.         c3[y++] = c1[x];
  730.     
  731.     for (x = 0; x < c2.length; x++)
  732.         c3[y++] = c2[x];
  733.     
  734.     return c3;
  735. }
  736.  
  737. /*
  738. function topWindow()
  739. {
  740.     //XXX need app specific
  741.     var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
  742.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  743.     var win = windowManagerInterface.getMostRecentWindow("navigator:browser");
  744.     if (!win)
  745.         win = window.openDialog("chrome://browser/content/browser.xul", "_blank", "chrome,all,dialog=no", "about:blank", null, null);
  746.     return win;
  747. }
  748. */
  749.  
  750. function handle_show_tag_command()
  751. {
  752.     su_get_element("show_tag2").checked = su_get_element("show_tag").checked;
  753. }
  754.  
  755. function handle_show_tag2_command()
  756. {
  757.     su_get_element("show_tag").checked = su_get_element("show_tag2").checked;
  758. }
  759.  
  760. function handle_stumble_topics_command()
  761. {
  762.     su_get_element("stumble_topics2").checked = su_get_element("stumble_topics").checked;
  763.     su_get_element("stumble_topics2_style_menu").disabled = !su_get_element("stumble_topics2").checked;
  764. }
  765.  
  766. function handle_stumble_topics2_command()
  767. {
  768.     su_get_element("stumble_topics").checked = su_get_element("stumble_topics2").checked;
  769.     su_get_element("stumble_topics2_style_menu").disabled = !su_get_element("stumble_topics2").checked;
  770. }
  771.  
  772. function update_download_favs_enabled_state()
  773. {
  774.     var sync = su_get_element("sync_bm_meta").checked;
  775.     
  776.     if (! sync)
  777.         handle_stop_download_favs_command();
  778.     
  779.     var detail = su_ds.getValue("#download_favs_detail");
  780.     
  781.     var enabled = (! detail);
  782.     
  783.     su_get_element("download_start").disabled = (! sync) || (! enabled);
  784.     su_get_element("download_stop").disabled = (! sync) || enabled;
  785.     su_get_element("sync_bm_exclude_adult").disabled = (! sync);
  786. }
  787.  
  788. function update_firstrater_label_enabled_state()
  789. {
  790.     if (su_get_element("icons-only").selected)
  791.     {
  792.         su_get_element("show_firstrater_label_always").checked = preferred_show_firstrater_label_always;
  793.         su_get_element("show_firstrater_label_always").disabled = false;
  794.     }
  795.     else if (su_get_element("text-icons").selected)
  796.     {
  797.         preferred_show_firstrater_label_always = su_get_element("show_firstrater_label_always").checked;
  798.         su_get_element("show_firstrater_label_always").checked = true;
  799.         su_get_element("show_firstrater_label_always").disabled = true;
  800.     }
  801. }
  802.  
  803. function su_update_searchlinks_logo_enabled_state()
  804. {
  805.     var show_searchlinks_score = su_get_element("show_searchlinks_score").checked;
  806.     var show_searchlinks_friends = su_get_element("show_searchlinks_friends").checked;
  807.     var show_searchlinks_topic = su_get_element("show_searchlinks_topic").checked;
  808.     su_get_element("show_searchlinks_logo").disabled = 
  809.             (!(show_searchlinks_score || show_searchlinks_friends || show_searchlinks_topic));
  810. }
  811.  
  812. function update_mode_enabled_state()
  813. {
  814.     var enabled = su_get_element("show_mode").checked;
  815.     var i;
  816.     for (i = 0; i < mode_ids.length; i++)
  817.         su_get_element(mode_ids[i]).disabled = (! enabled);
  818.     
  819.     su_get_element("show_mode_more").disabled = (! enabled);
  820.     su_get_element("show_mode_more_button").disabled = (! enabled);
  821. }
  822.  
  823. //function update_field_enabled_state()
  824. //{
  825. //    var enabled = su_get_element("show_field").checked;
  826. //    
  827. //    su_get_element("search_group_prompt").disabled = (! enabled);
  828. //    su_get_element("search_group_query").disabled = (! enabled);
  829. //    su_get_element("search_group_tag").disabled = (! enabled);
  830. //    
  831. //}
  832.  
  833. function handle_download_favs_command()
  834. {
  835.     su_ds.setValue("#download_favs_detail", null);
  836.     su_ds.setValue("$download_favs_detail", {});
  837.     su_ds.flushPrefs();
  838.     
  839.     parent_window.setTimeout(function (win) {
  840.                 win.su_handle_download_favs_command(); },
  841.             100,
  842.             parent_window);
  843. }
  844.  
  845. function handle_stop_download_favs_command()
  846. {
  847.     setTimeout(handle_stop_download_favs_command2, 100);
  848. }
  849.  
  850. function handle_stop_download_favs_command2()
  851. {
  852.     var db = su_ds.getDatabase();
  853.     var sql;
  854.     var context;
  855.     su_ds.setValue("$download_favs_state", "a");
  856.     su_ds.setValue("#download_favs_detail", null);
  857.     su_ds.setValue("$download_favs_detail", {});
  858.     su_ds.flushPrefs();
  859.     sql = "DELETE FROM command_queue WHERE priority=16000";
  860.     db.query(sql);
  861.     context = su_ds.getValue("#command_queue_context");
  862.     if (context)
  863.         context.command_rows = new Array();
  864.     su_get_element("download_progress").value = 0;
  865.     update_download_favs_enabled_state();
  866. }
  867.  
  868. function handle_toggle_label_click()
  869. {
  870.     su_get_element("toggle").checked = (! su_get_element("toggle").checked); 
  871. }
  872.  
  873. function handle_signin_command()
  874. {
  875.     if (opener && opener.location.href.indexOf("extensions.xul") != -1)
  876.     {
  877.         opener.setTimeout(
  878.                 function (win) { win.close(); },
  879.                 0,
  880.                 opener);
  881.     }
  882.     
  883.     parent_window.setTimeout(
  884.             function (win) { win.su_show_signin_dialog(); },
  885.             0,
  886.             parent_window);
  887.     
  888.     window.close();
  889. }
  890.  
  891. function handle_create_account_command()
  892. {
  893.     if (opener && opener.location.href.indexOf("extensions.xul") != -1)
  894.     {
  895.         opener.setTimeout(
  896.                 function (win) { win.close(); },
  897.                 0,
  898.                 opener);
  899.     }
  900.     
  901.     parent_window.setTimeout(
  902.             function (win) {
  903.                 win.su_set_server_location_signup(!win.su_is_about_blank()); },
  904.             0,
  905.             parent_window);
  906.     
  907.     window.close();
  908. }
  909.  
  910. function handle_toolbar_position_command(toolbar_position)
  911. {
  912.     if ((toolbar_position == "stumbleupon") || 
  913.             (toolbar_position == "gtbToolbar") || 
  914.             (toolbar_position == "yahoo-toolbar") ||
  915.             (toolbar_position == "prefbar") ||
  916.             (toolbar_position == "MBSTB-Toolbar"))
  917.     {
  918.         su_get_element("last").disabled = true;
  919.         su_get_element("position-group").selectedItem = su_get_element("first");
  920.     }
  921.     else
  922.     {
  923.         su_get_element("last").disabled = false;
  924.         su_get_element("position-group").selectedItem = su_get_element(preferred_position_group);
  925.     }
  926. }
  927.  
  928. function handle_position_group_command(position_group)
  929. {
  930.     preferred_position_group = position_group;
  931. }
  932.  
  933. function handle_customize_position_command()
  934. {
  935.     su_ds.setValue("@toolbar-position", "stumbleupon");
  936.     su_ds.setValue("@position-group", "drop");
  937.     su_ds.flushPrefs();
  938.     parent_window.setTimeout(function (parent) { parent.su_customize_toolbox(); }, 100, parent_window);
  939.     window.close();
  940. }
  941.  
  942. function handle_more_mode_command()
  943. {
  944.     window.openDialog(
  945.             "chrome://stumbleupon/content/moreChannelsDialog.xul", 
  946.             "More Channels",
  947.             "chrome,modal,dialog,centerscreen,dependent");
  948. }
  949.  
  950. function handle_shortcuts_enable_command(enabled)
  951. {
  952.     var ids = enable_ids;
  953.     
  954.     var i;
  955.     var found = false;
  956.     for (i = 0; i < ids.length; i++)
  957.     {
  958.         var el = su_get_element(ids[i]);
  959.         if (el == shortcut_item)
  960.             found = true;
  961.         var label = su_get_element(ids[i] + "_label");
  962.         if (enabled)
  963.         {
  964.             label.disabled = false;
  965.             el.setAttribute("label", "  " + 
  966.                     parent_window.su_get_display_keyspec(
  967.                     el.getAttribute("keyspec")));
  968.         }
  969.         else
  970.         {
  971.             label.disabled = true;
  972.             el.setAttribute("label", "");
  973.         }
  974.     }
  975.     
  976.     if (found && (! enabled))
  977.     {
  978.         shortcut_item = null;
  979.         refresh_shortcut_preview();
  980.     }
  981. }
  982.         
  983. // handles the select event for the shortcuts element
  984. function handle_shortcuts_select(event)
  985. {
  986.     su_get_element("shortcut_preview").disabled = false;
  987.     su_get_element("shortcut_change").disabled = false;
  988.     
  989.     shortcut_item = get_shortcut_item_from_index(event.target.selectedIndex);
  990.     keyspec = shortcut_item.getAttribute("keyspec");
  991.     
  992.     if (! su_get_element("shortcuts-enable").checked)
  993.     {
  994.         var ids = enable_ids;
  995.         var found = false;
  996.         for (i = 0; i < ids.length; i++)
  997.         {
  998.             if (ids[i] == shortcut_item.id)
  999.             {
  1000.                 found = true;
  1001.                 break;
  1002.             }
  1003.         }
  1004.         if (found)
  1005.         {
  1006.             su_get_element("shortcuts-enable").checked = true;
  1007.             handle_shortcuts_enable_command(true);
  1008.         }
  1009.     }
  1010.     
  1011.     refresh_shortcut_preview();
  1012. }
  1013.  
  1014. // dereferences a shortcut selected item index to the cell element
  1015. // used to display the shortcut
  1016. function get_shortcut_item_from_index(index)
  1017. {
  1018.     switch (index)
  1019.     {
  1020.         case 0: item_id = "shortcut_stumble";   break;
  1021.         case 1: item_id = "shortcut_thumbup";   break;
  1022.         case 2: item_id = "shortcut_thumbdown"; break;
  1023.         case 3: item_id = "shortcut_tag";       break;
  1024.         case 4: item_id = "shortcut_reviews";   break;
  1025.         case 5: item_id = "shortcut_toolbar";   break;
  1026. //        case 5: item_id = "shortcut_details";   break;
  1027. //        case 6: item_id = "shortcut_toolbar";   break;
  1028.     }
  1029.     return su_get_element(item_id);
  1030. }
  1031.  
  1032. // handles the shortcut disable button command
  1033. function handle_shortcut_disable_command()
  1034. {
  1035.     keyspec = "";
  1036.     shortcut_item.setAttribute("keyspec", keyspec);
  1037.     shortcut_item.setAttribute("label", "");
  1038.     
  1039.     refresh_shortcut_preview();
  1040.  
  1041.     if (shortcut_item.id == "shortcut_toolbar")
  1042.     {
  1043.         set_toolbar_position_label("StumbleUpon Toolbar");
  1044.     }
  1045. }
  1046.  
  1047. // handles the shortcut revert button command
  1048. function handle_shortcut_revert_command()
  1049. {
  1050.     keyspec = shortcut_item.getAttribute("keyspec-default");
  1051.     shortcut_item.setAttribute("keyspec", keyspec);
  1052.     shortcut_item.setAttribute("label", "  " + parent_window.su_get_display_keyspec(keyspec));
  1053.     
  1054.     refresh_shortcut_preview();
  1055.     
  1056.     var item_cur;
  1057.     for (var i = 0; i <= 5; i++)
  1058.     {
  1059.         item_cur = get_shortcut_item_from_index(i);
  1060.          if ((item_cur != shortcut_item) && (item_cur.getAttribute("keyspec") == keyspec))
  1061.         {
  1062.             item_cur.setAttribute("keyspec", "");
  1063.             item_cur.setAttribute("label", "");
  1064.             if ((i == TOGGLE_TOOLBAR_LISTITEM_INDEX) && (stumbleupon_toolbar_menuitem != null))
  1065.             {
  1066.                 set_toolbar_position_label("StumbleUpon Toolbar");
  1067.             }
  1068.         }
  1069.     }
  1070. }
  1071.  
  1072. // handles the shortcut change button command
  1073. function handle_shortcut_change_command()
  1074. {
  1075.     shortcut_item.setAttribute("keyspec", keyspec);
  1076.     shortcut_item.setAttribute("label", "  " + parent_window.su_get_display_keyspec(keyspec));
  1077.  
  1078.     refresh_shortcut_preview();    
  1079.     
  1080.     var item_cur;
  1081.     for (var i = 0; i <= 4; i++)
  1082.     {
  1083.         item_cur = get_shortcut_item_from_index(i);
  1084.         if ((item_cur != shortcut_item) && (item_cur.getAttribute("keyspec") == keyspec))
  1085.         {
  1086.             item_cur.setAttribute("keyspec", "");
  1087.             item_cur.setAttribute("label", "");
  1088.             if (i == TOGGLE_TOOLBAR_LISTITEM_INDEX)
  1089.             {
  1090.                 set_toolbar_position_label("StumbleUpon Toolbar");
  1091.             }
  1092.         }
  1093.     }
  1094.     
  1095.     if (shortcut_item.id == "shortcut_toolbar")
  1096.     {
  1097.         set_toolbar_position_label("StumbleUpon Toolbar (" +
  1098.                 parent_window.su_get_display_keyspec(keyspec) + ")")
  1099.     }
  1100. }
  1101.  
  1102. // used by the shortcut configuration routines to update the 
  1103. // StumbleUpon Toolbar menuitem in the toolbar-position popup
  1104. function set_toolbar_position_label(label)
  1105. {
  1106.     if (stumbleupon_toolbar_menuitem != null)
  1107.     {
  1108.         stumbleupon_toolbar_menuitem.label = label;
  1109.         var toolbar_position = su_get_element("toolbar-position");
  1110.         if (toolbar_position.selectedItem == stumbleupon_toolbar_menuitem)
  1111.         {
  1112.             if (stumbleupon_toolbar_menuitem.previousSibling)
  1113.             {
  1114.                 toolbar_position.selectedItem = stumbleupon_toolbar_menuitem.previousSibling;
  1115.                 toolbar_position.selectedItem = stumbleupon_toolbar_menuitem;
  1116.             }
  1117.             else if (stumbleupon_toolbar_menuitem.nextSibling)
  1118.             {
  1119.                 toolbar_position.selectedItem = stumbleupon_toolbar_menuitem.nextSibling;
  1120.                 toolbar_position.selectedItem = stumbleupon_toolbar_menuitem;
  1121.             }
  1122.         }
  1123.     }
  1124. }
  1125.  
  1126. // handles the keyup event for the shortcuts list
  1127. function handle_shortcuts_keyup(event)
  1128. {
  1129.     if ((event.keyCode == KeyEvent.DOM_VK_UP) ||
  1130.             (event.keyCode == KeyEvent.DOM_VK_DOWN))
  1131.     {
  1132.         return true;
  1133.     }
  1134.     else
  1135.     {
  1136.         return handle_shortcut_preview_keyup(event);
  1137.     }
  1138. }
  1139.  
  1140. // handles the keypress event for the shortcuts list
  1141. function handle_shortcuts_keypress(event)
  1142. {
  1143.     return handle_shortcut_preview_keypress(event);
  1144. }
  1145.  
  1146. // handles the keypress event for the shortcut-preview textbox
  1147. function handle_shortcut_preview_keypress(event)
  1148. {
  1149.   var str = "";
  1150.  
  1151.     if (event.altKey)   str += "Alt+";
  1152.     if (event.ctrlKey)  str += "Ctrl+";
  1153.     if (event.metaKey)  str += "Command+";
  1154.     if (event.shiftKey) str += "Shift+";
  1155.  
  1156.     recent_keypress_modifiers = str;
  1157.  
  1158.     return true;
  1159. }
  1160.  
  1161. // handles the keyup event for the shortcut-preview textbox
  1162. function handle_shortcut_preview_keyup(event)
  1163. {
  1164.   if ((event.keyCode == KeyEvent.DOM_VK_TAB) ||
  1165.               (event.keyCode == KeyEvent.DOM_VK_SHIFT) ||
  1166.               (event.keyCode == KeyEvent.DOM_VK_CONTROL) ||
  1167.               (event.keyCode == KeyEvent.DOM_VK_ALT) ||
  1168.               (event.keyCode == KeyEvent.DOM_VK_META) ||
  1169.               (event.keyCode == KeyEvent.DOM_VK_NUM_LOCK) ||
  1170.               (event.keyCode == KeyEvent.DOM_VK_SCROLL_LOCK) ||
  1171.               (event.keyCode == KeyEvent.DOM_VK_CAPS_LOCK))
  1172.   {
  1173.       return true;
  1174.   }
  1175.   event.stopPropagation();
  1176.   event.preventDefault();
  1177.     
  1178.     var keyid;
  1179.     if (event.charCode)
  1180.         keyid = parent_window.su_keyids_by_eventkeycode[event.charCode];
  1181.     else
  1182.         keyid = parent_window.su_keyids_by_eventkeycode[event.keyCode];
  1183.     
  1184.     keyspec = recent_keypress_modifiers + keyid;
  1185.     refresh_shortcut_preview();
  1186.     
  1187.     return false;
  1188. }
  1189.  
  1190. // sets button and label state given keyspec being previewed as a
  1191. // binding for shortcut_item
  1192. function refresh_shortcut_preview()
  1193. {
  1194.     var shortcut_revert = su_get_element("shortcut_revert");
  1195.     var shortcut_disable = su_get_element("shortcut_disable");
  1196.     var shortcut_change = su_get_element("shortcut_change");
  1197.  
  1198.     if (! shortcut_item)
  1199.     {
  1200.         if (shortcut_revert.hasAttribute("tooltiptext"))
  1201.             shortcut_revert.removeAttribute("tooltiptext");
  1202.         
  1203.         shortcut_revert.disabled = true;
  1204.         shortcut_disable.disabled = true;
  1205.         shortcut_change.disabled = true;
  1206.         
  1207.         su_get_element("shortcut_preview").value = "";
  1208.         su_get_element("shortcut_default_behavior").value = "";
  1209.         return;
  1210.     }
  1211.  
  1212.     var keyspec_current = shortcut_item.getAttribute("keyspec");
  1213.     var keyspec_default = shortcut_item.getAttribute("keyspec-default");
  1214.     
  1215.     if (keyspec_current == keyspec_default)
  1216.     {
  1217.         shortcut_revert.removeAttribute("tooltiptext");
  1218.         shortcut_revert.disabled = true;
  1219.     }
  1220.     else
  1221.     {
  1222.         shortcut_revert.setAttribute("tooltiptext", 
  1223.                 "Revert to " + parent_window.su_get_display_keyspec(keyspec_default));
  1224.         shortcut_revert.disabled = false;
  1225.     }
  1226.     
  1227.     shortcut_change.disabled = (keyspec_current == keyspec);
  1228.     
  1229.     shortcut_disable.disabled = (keyspec_current == "");
  1230.  
  1231.     su_get_element("shortcut_preview").value = parent_window.su_get_display_keyspec(keyspec);
  1232.     su_get_element("shortcut_default_behavior").value = get_default_binding_desc(keyspec);
  1233. }
  1234.  
  1235. // returns description suitable for user consuption for the target
  1236. // of a keybinding
  1237. function get_default_binding_desc(spec)
  1238. {
  1239.     var desc = "";
  1240.  
  1241.     if (spec == "")
  1242.     {
  1243.         return desc;
  1244.     }
  1245.  
  1246.     if (is_keyspec_accellerated(spec))
  1247.     {
  1248.         if (typeof parent_window.su_keys_by_keyspec[spec] != "undefined")
  1249.         {
  1250.             var key = parent_window.su_keys_by_keyspec[spec];
  1251.             desc = get_binding_name_from_key(key);
  1252.             if (desc == "key_StumbleUpon:ToggleToolbar")
  1253.                 desc = "";
  1254.         }
  1255.         else if ((spec.indexOf("Alt") != -1) && 
  1256.                 (spec.replace(/[\+_]/g, "").search(/\d|\W/) == -1) &&
  1257.                 (spec.indexOf("VK_BACK_QUOTE") == -1) &&
  1258.                 (spec != "Alt+VK_SLASH"))
  1259.         {
  1260.             desc = "[menu accelerator]";
  1261.         }
  1262.         else if ((! parent_window.su_host.win) &&
  1263.                 (spec.search(/VK_\d/) != -1))
  1264.         {
  1265.             desc = "[mode/navigation]";
  1266.         }
  1267.     }
  1268.     else if (is_keyspec_editing(spec))
  1269.     {
  1270.         desc = "[editing]";
  1271.     }
  1272.     else
  1273.     {
  1274.         desc = "[mode/navigation]"
  1275.     }
  1276.     return desc;
  1277. }
  1278.  
  1279. function is_keyspec_accellerated(spec)
  1280. {
  1281.     return (spec.indexOf("Ctrl") != -1) ||
  1282.             (spec.indexOf("Alt") != -1) ||
  1283.             (spec.indexOf("Command") != -1)
  1284. }
  1285.  
  1286. function is_keyspec_editing(spec)
  1287. {
  1288.     if ((spec.indexOf("VK_HOME") != -1) ||
  1289.             (spec.indexOf("VK_END") != -1) ||
  1290.             (spec.indexOf("VK_INSERT") != -1) ||
  1291.             (spec.indexOf("VK_DELETE") != -1))
  1292.     {
  1293.         return true;
  1294.     }
  1295.     else if (is_keyspec_accellerated(spec))
  1296.     {
  1297.         return false;
  1298.     }
  1299.     else if (spec.indexOf("VK_NUMPAD") != -1)
  1300.     {
  1301.         return true;
  1302.     }
  1303.     else
  1304.     {
  1305.         var parts = spec.split("+");
  1306.         return parts[parts.length - 1].length <= 4;
  1307.     }
  1308. }
  1309.  
  1310. // [IP:] [kudos:] The following two functions are from the public 
  1311. // domain keyconfig extension by Joe Dorando. -- JW
  1312.  
  1313. // searches for a description suitable for user consumption for a
  1314. // given key element
  1315. function get_binding_name_from_key(aKey)
  1316. {
  1317.   var val;
  1318.  
  1319.   if(aKey.hasAttribute("label")) return aKey.getAttribute("label");
  1320.  
  1321.   if(aKey.hasAttribute("command") || aKey.hasAttribute("observes")) {
  1322.     var command = aKey.getAttribute("command") || aKey.getAttribute("observes");
  1323.     var node = parent_window.su_get_element(command);
  1324.     if(node && node.hasAttribute("label")) return node.getAttribute("label");
  1325.     val = getLabel("command", command);
  1326.     if(!val) val = getLabel("observes", command);
  1327.   }
  1328.  
  1329.   if(!val) val = getLabel("key", aKey.id);
  1330.  
  1331.   if(val) return val;
  1332.  
  1333.   var id = aKey.id.replace(/xxx_key.+?_/,"");
  1334.     var converter = su_create_instance(
  1335.                 "@mozilla.org/intl/scriptableunicodeconverter",
  1336.                 "nsIScriptableUnicodeConverter");
  1337.   try {
  1338.         id = converter.ConvertToUnicode(id);
  1339.     } catch(err) {}
  1340.  
  1341.   return id;
  1342. }
  1343. function getLabel(attr, value) {
  1344.   var Users = parent_window.document.getElementsByAttribute(attr,value);
  1345.   var User;
  1346.  
  1347.   for(var i = 0, l = Users.length; i < l; i++)
  1348.     if(Users[i].hasAttribute("label") && (!User || User.localName == "menuitem")) User = Users[i];
  1349.  
  1350.   if(!User) return null;
  1351.  
  1352.   if(User.localName == "menuitem" && User.parentNode.parentNode.parentNode.localName == "menupopup") {
  1353.     return User.getAttribute("label") + " [" + User.parentNode.parentNode.getAttribute("label") + "]";
  1354.   } else return User.getAttribute("label");
  1355. }
  1356.  
  1357.  
  1358.